/*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net)
 * Licensed under the MIT License (LICENSE.txt).
 *
 * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
 * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
 * Thanks to: Seamus Leahy for adding deltaX and deltaY
 *
 * Version: 3.0.6
 * 
 * Requires: 1.2.2+
 */

(function($) {

    var types = ['DOMMouseScroll', 'mousewheel'];

    if ($.event.fixHooks) {
        for ( var i=types.length; i; ) {
            $.event.fixHooks[ types[--i] ] = $.event.mouseHooks;
        }
    }

    $.event.special.mousewheel = {
        setup: function() {
            if ( this.addEventListener ) {
                for ( var i=types.length; i; ) {
                    this.addEventListener( types[--i], handler, false );
                }
            } else {
                this.onmousewheel = handler;
            }
        },

        teardown: function() {
            if ( this.removeEventListener ) {
                for ( var i=types.length; i; ) {
                    this.removeEventListener( types[--i], handler, false );
                }
            } else {
                this.onmousewheel = null;
            }
        }
    };

    $.fn.extend({
        mousewheel: function(fn) {
            return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
        },

        unmousewheel: function(fn) {
            return this.unbind("mousewheel", fn);
        }
    });


    function handler(event) {
        var orgEvent = event || window.event, args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true, deltaX = 0, deltaY = 0;
        event = $.event.fix(orgEvent);
        event.type = "mousewheel";

        // Old school scrollwheel delta
        if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta/120; }
        if ( orgEvent.detail     ) { delta = -orgEvent.detail/3; }

        // New school multidimensional scroll (touchpads) deltas
        deltaY = delta;

        // Gecko
        if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
            deltaY = 0;
            deltaX = -1*delta;
        }

        // Webkit
        if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY/120; }
        if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = -1*orgEvent.wheelDeltaX/120; }

        // Add event and delta to the front of the arguments
        args.unshift(event, delta, deltaX, deltaY);

        return ($.event.dispatch || $.event.handle).apply(this, args);
    }

})(jQuery);

/**
 * @version		2.0
 * @package		jquery
 * @subpackage	lofslidernews
 * @copyright	Copyright (C) JAN 2010 LandOfCoder.com <@emai:landofcoder@gmail.com>. All rights reserved.
 * @website     http://landofcoder.com
 * @license		This plugin is dual-licensed under the GNU General Public License and the MIT License
 */
// JavaScript Document
(function($) {
    $.fn.lofJSidernews = function( settings ) {
        return this.each(function() {
            // get instance of the lofSiderNew.
            new  $.lofSidernews( this, settings );
        });
    }
    $.lofSidernews = function( obj, settings ){
        this.settings = {
            direction	    	: '',
            mainItemSelector    : 'li',
            navInnerSelector	: 'ul',
            navSelector  		: 'li' ,
            navigatorEvent		: 'click'/* click|mouseenter */,
            wapperSelector: 	'.sliders-wrap-inner',
            interval	  	 	: 5000,
            auto			    : false, // whether to automatic play the slideshow
            maxItemDisplay	 	: 3,
            startItem			: 0,
            navPosition			: 'vertical',/* values: horizontal|vertical*/
            navigatorHeight		: 100,
            navigatorWidth		: 310,
            duration			: 600,
            navItemsSelector    : '.navigator-wrap-inner li',
            navOuterSelector    : '.navigator-wrapper' ,
            isPreloaded			: true,
            easing				: 'easeInOutQuad',
            onPlaySlider:function(obj, slider){},
            onComplete:function(slider, index){  }
            ,rtl:false
        }
        $.extend( this.settings, settings ||{} );
        this.nextNo         = null;
        this.previousNo     = null;
        this.maxWidth  = this.settings.mainWidth || 684;



        this.wrapper = $( obj ).find( this.settings.wapperSelector );
        var wrapOuter = $('<div class="sliders-wrapper"></div>').width( this.maxWidth );
        this.wrapper.wrap( wrapOuter );

        this.slides = this.wrapper.find( this.settings.mainItemSelector );
        if( !this.wrapper.length || !this.slides.length ) return ;
        // set width of wapper
        if( this.settings.maxItemDisplay > this.slides.length ){
            this.settings.maxItemDisplay = this.slides.length;
        }
        this.currentNo      = isNaN(this.settings.startItem)||this.settings.startItem > this.slides.length?0:this.settings.startItem;
        this.navigatorOuter = $( obj ).find( this.settings.navOuterSelector );
        this.navigatorItems = $( obj ).find( this.settings.navItemsSelector ) ;
        this.navigatorInner = this.navigatorOuter.find( this.settings.navInnerSelector );
        // if use automactic calculate width of navigator

        if( this.settings.navigatorHeight == null || this.settings.navigatorWidth == null ){
            this.settings.navigatorHeight = this.navigatorItems.eq(0).outerWidth(true);
            this.settings.navigatorWidth = this.navigatorItems.eq(0).outerHeight(true);

        }
        if( this.settings.navPosition == 'horizontal' ){
            this.navigatorInner.width( this.slides.length * this.settings.navigatorWidth );
            this.navigatorOuter.width( this.settings.maxItemDisplay * this.settings.navigatorWidth );
            this.navigatorOuter.height(	this.settings.navigatorHeight );

        } else {
            this.navigatorInner.height( this.slides.length * this.settings.navigatorHeight );

            this.navigatorOuter.height( this.settings.maxItemDisplay * this.settings.navigatorHeight );
            this.navigatorOuter.width(	this.settings.navigatorWidth );
        }
        this.slides.width( this.settings.mainWidth );
        this.navigratorStep = this.__getPositionMode( this.settings.navPosition );
        this.directionMode = this.__getDirectionMode();


        if( this.settings.direction == 'opacity') {
            this.wrapper.addClass( 'lof-opacity' );
            $(this.slides).css({'opacity':0,'z-index':1}).eq(this.currentNo).css({'opacity':1,'z-index':3});
        } else {
            if(this.settings.rtl)
                this.wrapper.css({'right':'-'+this.currentNo*this.maxSize+'px', 'width':( this.maxWidth ) * this.slides.length } );
            else
                this.wrapper.css({'left':'-'+this.currentNo*this.maxSize+'px', 'width':( this.maxWidth ) * this.slides.length } );
        }


        if( this.settings.isPreloaded ) {
            this.preLoadImage( this.onComplete );
        } else {
            this.onComplete();
        }

        $buttonControl = $( ".button-control", obj);
        if( this.settings.auto ){
            $buttonControl.addClass("action-stop");
        } else {
            $buttonControl.addClass("action-start");
        }
        var self = this;

        $( obj ).hover(function(){
            self.stop();
            $buttonControl.addClass("action-start").removeClass("action-stop").addClass("hover-stop");
        }, function(){
            if( $buttonControl.hasClass("hover-stop") ){

                if(	self.settings.auto ){
                    $buttonControl.removeClass("action-start").removeClass("hover-stop").addClass("action-stop");
                    self.play( self.settings.interval,'next', true );
                }
            }
        } );


        $buttonControl.click( function() {
            if( $buttonControl.hasClass("action-start") ){
                self.settings.auto =true;
                self.play( self.settings.interval,'next', true );
                $buttonControl.removeClass("action-start").addClass("action-stop");
            } else{
                self.settings.auto =false;
                self.stop();
                $buttonControl.addClass("action-start").removeClass("action-stop");
            }
        } );
    }
    $.lofSidernews.fn =  $.lofSidernews.prototype;
    $.lofSidernews.fn.extend =  $.lofSidernews.extend = $.extend;

    $.lofSidernews.fn.extend({

        startUp:function( obj, wrapper ) {
            seft = this;

            this.navigatorItems.each( function(index, item ){
                $(item).bind( seft.settings.navigatorEvent,( function(){
                    seft.jumping( index, true );
                    seft.setNavActive( index, item );
                } ));
                $(item).css( {'height': seft.settings.navigatorHeight, 'width':  seft.settings.navigatorWidth} );
            })
            this.registerWheelHandler( this.navigatorOuter, this );
            this.setNavActive( this.currentNo );
            this.settings.onComplete( this.slides.eq(this.currentNo ),this.currentNo  );
            if( this.settings.buttons && typeof (this.settings.buttons) == "object" ){
                this.registerButtonsControl( 'click', this.settings.buttons, this );

            }
            if( this.settings.auto )
                this.play( this.settings.interval,'next', true );

            return this;
        },
        onComplete:function(){
            setTimeout( function(){ $('.preload').fadeOut( 900, function(){  $('.preload').remove(); } ); }, 400 );	this.startUp( );
        },
        preLoadImage:function(  callback ){
            var self = this;
            var images = this.wrapper.find( 'img' );

            var count = 0;
            images.each( function(index,image){
                if( !image.complete ){
                    image.onload =function(){
                        count++;
                        if( count >= images.length ){
                            self.onComplete();
                        }
                    }
                    image.onerror =function(){
                        count++;
                        if( count >= images.length ){
                            self.onComplete();
                        }
                    }
                }else {
                    count++;
                    if( count >= images.length ){
                        self.onComplete();
                    }
                }
            } );
        },
        navivationAnimate:function( currentIndex ) {
            if (currentIndex <= this.settings.startItem
                || currentIndex - this.settings.startItem >= this.settings.maxItemDisplay-1) {
                this.settings.startItem = currentIndex - this.settings.maxItemDisplay+2;
                if (this.settings.startItem < 0) this.settings.startItem = 0;
                if (this.settings.startItem >this.slides.length-this.settings.maxItemDisplay) {
                    this.settings.startItem = this.slides.length-this.settings.maxItemDisplay;
                }
            }

            this.navigatorInner.stop().animate( eval('({'+this.navigratorStep[0]+':-'+this.settings.startItem*this.navigratorStep[1]+'})'),
                {duration:500, easing:'easeInOutQuad'} );
        },
        setNavActive:function( index, item ){
            if( (this.navigatorItems) ){
                this.navigatorItems.removeClass( 'active' );
                $(this.navigatorItems.get(index)).addClass( 'active' );
                this.navivationAnimate( this.currentNo );
            }
        },
        __getPositionMode:function( position ){
            if(	position  == 'horizontal' ){
                if(this.settings.rtl)
                    return ['right', this.settings.navigatorWidth];
                else
                    return ['left', this.settings.navigatorWidth];
            }
            return ['top', this.settings.navigatorHeight];
        },
        __getDirectionMode:function(){
            switch( this.settings.direction ){
                case 'opacity': this.maxSize=0; return ['opacity','opacity'];
                default: this.maxSize=this.maxWidth;
                    if(this.settings.rtl)
                        return ['right','width'];
                    else
                        return ['left','width'];
            }
        },
        registerWheelHandler:function( element, obj ){
            element.bind('mousewheel', function(event, delta ) {
                var dir = delta > 0 ? 'Up' : 'Down',
                    vel = Math.abs(delta);
                if( delta > 0 ){
                    obj.previous( true );
                } else {
                    obj.next( true );
                }
                return false;
            });
        },
        registerButtonsControl:function( eventHandler, objects, self ){
            for( var action in objects ){
                switch (action.toString() ){
                    case 'next':
                        objects[action].click( function() { self.next( true) } );
                        break;
                    case 'previous':
                        objects[action].click( function() { self.previous( true) } );
                        break;
                }
            }
            return this;
        },
        onProcessing:function( manual, start, end ){
            this.previousNo = this.currentNo + (this.currentNo>0 ? -1 : this.slides.length-1);
            this.nextNo 	= this.currentNo + (this.currentNo < this.slides.length-1 ? 1 : 1- this.slides.length);
            return this;
        },
        finishFx:function( manual ){
            if( manual ) this.stop();
            if( manual && this.settings.auto ){
                this.play( this.settings.interval,'next', true );
            }
            this.setNavActive( this.currentNo );
            this.settings.onPlaySlider( this, $(this.slides).eq(this.currentNo) );
        },
        getObjectDirection:function( start, end ){
            return eval("({'"+this.directionMode[0]+"':-"+(this.currentNo*start)+"})");
        },
        fxStart:function( index, obj, currentObj ){
            var s = this;
            if( this.settings.direction == 'opacity' ) {

                $(this.slides).stop().animate({opacity:0}, {duration: this.settings.duration, easing:this.settings.easing,complete:function(){
                    s.slides.css("z-index","1")
                    s.slides.eq(index).css("z-index","3");
                }} );
                $(this.slides).eq(index).stop().animate( {opacity:1}, { duration : this.settings.duration,
                    easing   :this.settings.easing,
                    complete :function(){ s.settings.onComplete($(s.slides).eq(index),index); }} );
            }else {
                this.wrapper.stop().animate( obj, {duration: this.settings.duration, easing:this.settings.easing,complete:function(){
                    s.settings.onComplete($(s.slides).eq(index),index)
                } } );
            }
            return this;
        },
        jumping:function( no, manual ){
            this.stop();
            if( this.currentNo == no ) return;
            var obj = eval("({'"+this.directionMode[0]+"':-"+(this.maxSize*no)+"})");
            this.onProcessing( null, manual, 0, this.maxSize )
                .fxStart( no, obj, this )
                .finishFx( manual );
            this.currentNo  = no;
        },
        next:function( manual , item){

            this.currentNo += (this.currentNo < this.slides.length-1) ? 1 : (1 - this.slides.length);
            this.onProcessing( item, manual, 0, this.maxSize )
                .fxStart( this.currentNo, this.getObjectDirection(this.maxSize ), this )
                .finishFx( manual );
        },
        previous:function( manual, item ){
            this.currentNo += this.currentNo > 0 ? -1 : this.slides.length - 1;
            this.onProcessing( item, manual )
                .fxStart( this.currentNo, this.getObjectDirection(this.maxSize ), this )
                .finishFx( manual	);
        },
        play:function( delay, direction, wait ){
            this.stop();
            if(!wait){ this[direction](false); }
            var self  = this;
            this.isRun = setTimeout(function() { self[direction](true); }, delay);
        },
        stop:function(){
            if (this.isRun == null) return;
            clearTimeout(this.isRun);
            this.isRun = null;
        }
    })
})(jQuery)
